package br.com.petsis.funcionalidades.auditoria;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Auditoria;
import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.Usuario;
import br.com.petsis.enumerations.TipoOperacaoEnum;

@Name("consultarAuditoriaController")
@Scope(ScopeType.CONVERSATION)
public class ConsultarAuditoriaController {
	
	private static final String QRY_AUDITORIAS = "select a from Auditoria a where a.idAuditoria is not null ";

	@In(create=true)
	private EntityManager entityManager;
	
	private List<Auditoria> listaAuditorias;
	
	private List<SelectItem> listaUsuario;
	
	private List<SelectItem> listaTipos;
	
	private List<SelectItem> listaEmpresas;
	
	private Integer idUsuario;
	
	private Integer idEmpresa;
	
	private Integer tipoOperacao;
	
	private String tabela;
	
	private Date dataInicio;
	
	private Date dataFim;
	
	private String detalheAlteracao;
	
	@In(required=false)
    private Empresa empresaSessao;
	
	public void onLoad(){
	}
	
	public void pesquisar(){
		StringBuffer query = new StringBuffer(QRY_AUDITORIAS);
		if(idUsuario != null){
			query.append(" and a.dscUsuario like (:usuario)");
		}
		if(tipoOperacao != null){
			query.append(" and a.tpoOperacao = :tipo");
		}
		if(tabela != null && !tabela.isEmpty()){
			query.append(" and a.dscTabela like (:tabela)");
		}
		if(dataInicio != null){
			query.append(" and DATE(a.dtaOperacao) >= DATE(:dataInicio)");
		}
		if(dataFim != null){
			query.append(" and DATE(a.dtaOperacao) <= DATE(:dataFim)");
		}
		if(empresaSessao != null){
			query.append(" and a.empresa.idEmpresa = :idEmpresa");
		}
		if(idEmpresa != null){
			query.append(" and a.empresa.idEmpresa = :idEmpresa");
		}
		
		query.append(" order by a.dtaOperacao DESC");
		
		Query qryResult = entityManager.createQuery(query.toString());
		
		if(idUsuario != null){
			qryResult.setParameter("usuario", "%"+idUsuario+"%");
		}
		if(tipoOperacao != null){
			qryResult.setParameter("tipo", tipoOperacao);
		}
		if(tabela != null && !tabela.isEmpty()){
			qryResult.setParameter("tabela", "%"+tabela+"%");
		}
		if(dataInicio != null){
			qryResult.setParameter("dataInicio", dataInicio);
		}
		if(dataFim != null){
			qryResult.setParameter("dataFim", dataFim);
		}
		if(empresaSessao != null){
			qryResult.setParameter("idEmpresa", empresaSessao.getIdEmpresa());
		}
		if(idEmpresa != null){
			qryResult.setParameter("idEmpresa", getIdEmpresa());
		}
		
		qryResult.setMaxResults(1000);
		listaAuditorias = qryResult.getResultList();
		if(listaAuditorias.size() == 1000){
			FacesMessages.instance().add(Severity.WARN,"Esta pesquisa esta limitada a 1000 registros. Caso necessite, refine a sua busca.");
		}else if(listaAuditorias == null || listaAuditorias.size() == 0){
			FacesMessages.instance().add(Severity.INFO,"Nenhum registro encontrado.");
		}else{
			FacesMessages.instance().add(Severity.INFO,"Foram encontrados "+listaAuditorias.size()+" registros");
		}
	}
	
	public String recuperaDescricaoTipoOperacao(Integer id){
		if(id != null){
			switch (id) {
			case 1:
				return TipoOperacaoEnum.INCLUSAO.getDescricao();
			case 2:
				return TipoOperacaoEnum.ALTERACAO.getDescricao();
			case 3:
				return TipoOperacaoEnum.EXCLUSAO.getDescricao();
			default:
				break;
			}
		}
		return null;
	}
	
	public void inicializaPopupDetalhe(Auditoria auditoria){
		detalheAlteracao = AuditoriaController.compararDados(auditoria.getDscDadosAntigos(), auditoria.getDscDadosAtuais());
	}

	public List<Auditoria> getListaAuditorias() {
		if (listaAuditorias == null) {
			listaAuditorias = new ArrayList<Auditoria>();
		}
		return listaAuditorias;
	}

	public void setListaAuditorias(List<Auditoria> listaAuditorias) {
		this.listaAuditorias = listaAuditorias;
	}

	public List<SelectItem> getListaUsuario() {
		if (listaUsuario == null) {
			listaUsuario = new ArrayList<SelectItem>();
			listaUsuario.add(new SelectItem(null,"Selecione"));
			if(empresaSessao != null){
				List<Usuario> lista = entityManager.createQuery("select u from Usuario u where u.empresa.idEmpresa = :idEmpresa and u.flgAtivo = 'T' order by u.dscNome")
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList();
				for(Usuario u : lista){
					listaUsuario.add(new SelectItem(u.getIdUsuario(),u.getDscNome()));
				}
			}
		}
		return listaUsuario;
	}

	public void setListaUsuario(List<SelectItem> listaUsuario) {
		this.listaUsuario = listaUsuario;
	}

	public List<SelectItem> getListaTipos() {
		if (listaTipos == null) {
			listaTipos = new ArrayList<SelectItem>();
			listaTipos.add(new SelectItem(null,"Selecione"));
			listaTipos.add(new SelectItem(TipoOperacaoEnum.INCLUSAO.getId(),TipoOperacaoEnum.INCLUSAO.getDescricao()));
			listaTipos.add(new SelectItem(TipoOperacaoEnum.ALTERACAO.getId(),TipoOperacaoEnum.ALTERACAO.getDescricao()));
			listaTipos.add(new SelectItem(TipoOperacaoEnum.EXCLUSAO.getId(),TipoOperacaoEnum.EXCLUSAO.getDescricao()));
		}
		return listaTipos;
	}

	public void setListaTipos(List<SelectItem> listaTipos) {
		this.listaTipos = listaTipos;
	}

	public List<SelectItem> getListaEmpresas() {
		if (listaEmpresas == null) {
			listaEmpresas = new ArrayList<SelectItem>();
			listaEmpresas.add(new SelectItem(null,"Selecione"));
			List<Object[]> lista = entityManager.createNativeQuery("select e.id_empresa,e.dsc_razao_social from empresa e where e.flg_ativo = 'T' order by e.dsc_razao_social")
				.getResultList();
			for(Object[] o : lista){
				listaEmpresas.add(new SelectItem(Integer.parseInt(o[0].toString()), o[1].toString()));
			}
		}
		return listaEmpresas;
	}

	public void setListaEmpresas(List<SelectItem> listaEmpresas) {
		this.listaEmpresas = listaEmpresas;
	}

	public Integer getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(Integer idUsuario) {
		this.idUsuario = idUsuario;
	}

	public Integer getIdEmpresa() {
		return idEmpresa;
	}

	public void setIdEmpresa(Integer idEmpresa) {
		this.idEmpresa = idEmpresa;
	}

	public Integer getTipoOperacao() {
		return tipoOperacao;
	}

	public void setTipoOperacao(Integer tipoOperacao) {
		this.tipoOperacao = tipoOperacao;
	}

	public String getTabela() {
		return tabela;
	}

	public void setTabela(String tabela) {
		this.tabela = tabela;
	}

	public Date getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(Date dataInicio) {
		this.dataInicio = dataInicio;
	}

	public Date getDataFim() {
		return dataFim;
	}

	public void setDataFim(Date dataFim) {
		this.dataFim = dataFim;
	}

	public String getDetalheAlteracao() {
		return detalheAlteracao;
	}

	public void setDetalheAlteracao(String detalheAlteracao) {
		this.detalheAlteracao = detalheAlteracao;
	}

}
